package com.billdowney.qq.robot.plugins;

import cn.hutool.core.util.StrUtil;
import com.billdowney.qq.robot.bean.ConfigBean;
import lombok.extern.slf4j.Slf4j;
import net.mamoe.mirai.message.data.At;
import net.mamoe.mirai.message.data.PlainText;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 系统操作机器人
 *
 * @author BillDowney
 * @date 2021/4/4 21:02
 */
@Component
@Slf4j
public class SystemRobotPlugin implements InitializingBean {

    private final String template = "名称：%s；启动：%s\n";
    /**
     * 机器人启动标记
     */
    private static boolean start = true;
    @Autowired
    private RobotPluginManage manage;
    @Autowired
    private ConfigBean configBean;
    /**
     * root管理员qq列表，拥有最高权限
     */
    private static Set<Long> rootManageQq = new HashSet<>();
    /**
     * 普通管理员qq列表
     */
    private static Set<Long> normalManageQq = new HashSet<>();

    @Override
    public void afterPropertiesSet() throws Exception {
        rootManageQq.addAll(configBean.getRootManageQq());
    }

    public RobotPluginInfo info() {
        return RobotPluginInfo.create("系统操作插件", true)
                .addDescLn("使用方式(需要配置管理员qq)：")
                .addDescLn("#管理员列表")
                .addDescLn("#添加管理员(root管理员)")
                .addDescLn("#删除管理员(root管理员)")
                .addDescLn("#管理员列表")
                .addDescLn("#启动机器人(root管理员)")
                .addDescLn("#关闭机器人(root管理员)")
                .addDescLn("#机器人状态")
                .addDescLn("#插件列表")
                .addDescLn("#开启插件 {插件名称}")
                .addDescLn("#关闭插件 {插件名称}")
                .addDescLn("#插件详情 {插件名称}");
    }

    public void execute(RobotPluginContent content) {
        content.setExecuteNext(start);
        // 只能管理员qq才能执行系统管理命令
        if (rootManageQq.isEmpty() || !content.getRobotEventEnum().isMessageEvent()
                || !(rootManageQq.contains(content.getMessageEvent().getSender().getId())
                || normalManageQq.contains(content.getMessageEvent().getSender().getId()))
        ) {
            return;
        }
        this.command(content);
    }

    /**
     * 命令执行
     *
     * @param content 机器人插件上下文
     */
    public void command(RobotPluginContent content) {
        String msg = content.getContent();
        switch (msg) {
            case "#插件列表":
                this.addPluginsListMessage(content);
                break;
            case "#启动机器人":
                if (rootManageQq.contains(content.getMessageEvent().getSender().getId())) {
                    start = true;
                    this.addRobotStatusMessage(content);
                }
                break;
            case "#关闭机器人":
                if (rootManageQq.contains(content.getMessageEvent().getSender().getId())) {
                    start = false;
                    this.addRobotStatusMessage(content);
                }
                break;
            case "#机器人状态":
                this.addRobotStatusMessage(content);
                break;
            case "#管理员列表":
                this.addManageMessage(content);
                break;
            default:
                if (msg.startsWith("#开启插件")) {
                    this.manage.start(msg.replace("#开启插件", "").trim());
                    this.addPluginsListMessage(content);
                } else if (msg.startsWith("#关闭插件")) {
                    this.manage.stop(msg.replace("#关闭插件", "").trim());
                    this.addPluginsListMessage(content);
                } else if (msg.startsWith("#插件详情")) {
                    String name = msg.replace("#插件详情", "").trim();
                    StringBuilder text = new StringBuilder();
                    if ("系统管理插件".equals(name)) {
                        text.append(String.format(template, this.info().getName(), true));
                        text.append(this.info().getDesc());
                    } else {
                        RobotPlugin plugin = this.manage.get(name);
                        if (plugin == null) {
                            text.append(String.format("无此插件【%s】", name));
                        } else {
                            text.append(String.format(template, plugin.info().getName(), this.manage.isStart(name)));
                            text.append(plugin.info().getDesc());
                        }
                    }
                    content.putReplyMessage(new PlainText(text.toString()));
                } else if (rootManageQq.contains(content.getMessageEvent().getSender().getId())) {
                    // root管理员才有的功能
                    if (msg.startsWith("#添加管理员")) {
                        AtomicBoolean flag = new AtomicBoolean(true);
                        content.getMessageEvent().getMessage().forEach(singleMessage -> {
                            if (singleMessage instanceof At) {
                                normalManageQq.add(((At) singleMessage).getTarget());
                                flag.set(false);
                            }
                        });
                        if (flag.get()) {
                            String qq = content.getContent().replaceFirst("#添加管理员", "").trim();
                            try {
                                normalManageQq.add(Long.parseLong(qq));
                            } catch (Exception e) {
                                String error = StrUtil.format("转换qq失败[{}]", qq);
                                log.error(error, e);
                                content.putReplyMessage(error);
                            }
                        }
                        this.addManageMessage(content);
                    } else if (msg.startsWith("#删除管理员")) {
                        AtomicBoolean flag = new AtomicBoolean(true);
                        content.getMessageEvent().getMessage().forEach(singleMessage -> {
                            if (singleMessage instanceof At) {
                                normalManageQq.remove(((At) singleMessage).getTarget());
                                flag.set(false);
                            }
                        });
                        if (flag.get()) {
                            String qq = content.getContent().replaceFirst("#删除管理员", "").trim();
                            try {
                                normalManageQq.remove(Long.parseLong(qq));
                            } catch (Exception e) {
                                String error = StrUtil.format("转换qq失败[{}]", qq);
                                log.error(error, e);
                                content.putReplyMessage(error);
                            }
                        }
                        this.addManageMessage(content);
                    }
                }
                break;
        }
    }

    /**
     * 添加插件列表消息
     *
     * @param content 机器人插件上下文
     */
    private void addPluginsListMessage(RobotPluginContent content) {
        StringBuffer text = new StringBuffer();
        manage.getAllFlag().forEach((key, value) -> {
            text.append(String.format(template, key.info().getName(), value));
        });
        if (text.length() == 0) {
            text.append("插件列表为空");
        }
        content.putReplyMessage(new PlainText(text.toString()));
    }

    /**
     * 添加机器人状态消息
     *
     * @param content 机器人插件上下文
     */
    private void addRobotStatusMessage(RobotPluginContent content) {
        content.putReplyMessage(String.format("机器人状态：%s", start));
    }

    /**
     * 添加管理员列表信息
     *
     * @param content
     */
    private void addManageMessage(RobotPluginContent content) {
        StringBuilder message = new StringBuilder();
        message.append("root管理员列表：\n");
        rootManageQq.forEach(item -> {
            message.append(item).append("\n");
        });
        message.append("普通管理员列表：\n");
        normalManageQq.forEach(item -> {
            message.append(item).append("\n");
        });
        content.putReplyMessage(message.toString());
    }

}
